(*******************************************************************************
   Modulo: Notas
   Descripcion: Programa que carga y almacena los datos de las notas y la cantidad de 
   lineas del archivo, tambien se encuentran los principales procesos del prorama principal
   Autor: Jesús Reyes
   Fecha: 29/05/2012
 *******************************************************************************)

IMPLEMENTATION MODULE Tad_Nota;

FROM libc IMPORT exit, printf;
FROM MathLib0 IMPORT sqrt;
FROM FpuIO IMPORT WriteReal;
FROM StrIO IMPORT WriteString, WriteLn;
FROM NumberIO IMPORT ReadInt,WriteInt;
FROM FIO IMPORT OpenToRead,File,EOF,ReadString;
FROM DynamicStrings IMPORT String, Slice, CopyOut, Index, InitString;
FROM StringConvert IMPORT StringToInteger, LongrealToString;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;

TYPE Nota = POINTER TO Not;

TYPE Not = RECORD
      cod_estudiante: INTEGER;
      cod_materia: INTEGER;
      cod_profesor: INTEGER;
      nota: INTEGER;
    END;
    

PROCEDURE Nuevo (estudiante:INTEGER;materia:INTEGER;profesor:INTEGER;nota:INTEGER):Nota;
VAR calificacion:Nota;
BEGIN
    NEW(calificacion);
    IF (calificacion = NIL) THEN
		RETURN NIL;
    END;
    calificacion^.cod_estudiante := estudiante;
    calificacion^.cod_materia := materia;
    calificacion^.cod_profesor := profesor;
    calificacion^.nota := nota;
    RETURN calificacion;

END Nuevo;

PROCEDURE AsigCodigoEstudiante (VAR calificacion: Nota; codigo: INTEGER);

BEGIN

  calificacion^.cod_estudiante := codigo;
  
END AsigCodigoEstudiante;

PROCEDURE AsigCodigoMateria (VAR calificacion: Nota; codigo: INTEGER);

BEGIN

  calificacion^.cod_materia := codigo;
  
END AsigCodigoMateria;

PROCEDURE AsigCodigoProfesor (VAR calificacion: Nota; codigo: INTEGER);

BEGIN

  calificacion^.cod_profesor := codigo;
  
END AsigCodigoProfesor;

PROCEDURE AsigNota (VAR calificacion: Nota; x: INTEGER);

BEGIN

  calificacion^.nota := x;
  
END AsigNota;


PROCEDURE GetCodigoEstudiante (calificacion: Nota) : INTEGER;
VAR x: INTEGER;

BEGIN

  x := calificacion^.cod_estudiante;
  
  RETURN x;
  
END GetCodigoEstudiante;

PROCEDURE GetCodigoMateria (calificacion: Nota) : INTEGER;
VAR x: INTEGER;

BEGIN

  x := calificacion^.cod_materia;
  
  RETURN x;
  
END GetCodigoMateria;

PROCEDURE GetCodigoProfesor (calificacion: Nota) : INTEGER;
VAR x: INTEGER;

BEGIN

  x := calificacion^.cod_profesor;
  
  RETURN x;
  
END GetCodigoProfesor;

PROCEDURE GetNota (calificacion: Nota) : INTEGER;
VAR x: INTEGER;

BEGIN

  x := calificacion^.nota;
  
  RETURN x;
  
END GetNota;


PROCEDURE Carga (data:File) : Nota;
VAR valido: BOOLEAN;
VAR string: String;
VAR cod_estudiante,cod_materia,cod_profesor,nota : INTEGER;
VAR linea: ARRAY [0..200] OF CHAR;
VAR inic,fin,i : CARDINAL;
VAR calificacion: Nota;
  BEGIN
	
	valido := TRUE;
	inic := 0;
	ReadString(data, linea);
	string := InitString(linea);
	fin := Index(string,":",inic);
	cod_estudiante := StringToInteger(Slice(string,inic,fin),10,valido);
	inic := fin + 1;
	fin := Index(string,":",inic);
	cod_materia := StringToInteger(Slice(string,inic,fin),10,valido);
	inic := fin + 1;
	fin := Index(string,":",inic);
	cod_profesor := StringToInteger(Slice(string,inic,fin),10,valido);
	inic := fin + 1;
	fin := 0;
	nota := StringToInteger(Slice(string,inic,fin),10,valido);
	calificacion := Nuevo(cod_estudiante,cod_materia,cod_profesor,nota);
	RETURN calificacion;
	
  END Carga;
  
  
PROCEDURE Imprimir(calificacion: Nota);
BEGIN
	WriteString('(');
	WriteString('CodigoEstudiante:');
	WriteInt(GetCodigoEstudiante(calificacion),0);
	WriteString(',CodigoMateria:');
	WriteInt(GetCodigoMateria(calificacion),0);
	WriteString(',CodigoProfesor:');
	WriteInt(GetCodigoProfesor(calificacion),0);
	WriteString(',Nota:');
	WriteInt(GetNota(calificacion),0);
	WriteString(')');
END Imprimir;

END Tad_Nota.
